package com.interheart.framecore.util;

import cn.hutool.core.util.ReflectUtil;
import com.interheart.framecore.dto.EnumProDto;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Auther: SHIKAI
 * @Date: 2019/5/10 15:54
 */
public class EnumUtil {
    /**
     * 功能描述 枚举默认值得属性名
     * @author SHIKAI
     * @date 2019/6/4
     * @param
     * @return
     */
    private static final String ENUM_VALUE_PRO_NAME = "getValue";
    private static final String ENUM_DESC_PRO_NAME = "getDesc";
    /**
     * 功能描述 通过枚举值获取枚举说明
     * @author SHIKAI
     * @date 2019/5/10
     * @param
     * @return
     */
    public static <T> T getDescByValue(Class<?> enumClass, Integer value){
       return getEnumPro(enumClass, value, ENUM_DESC_PRO_NAME);
    }
    /**
     * 功能描述 通过枚举值和枚举的get方法获取枚举的属性，
     * @author SHIKAI
     * @date 2019/5/10
     * @param value 枚举的值
     * @param pro 枚举的其他属性get方法（getdesc 或者其他自定义属性）
     * @return
     */
    public static <T> T getEnumPro(Class<?> enumClass, Integer value, String pro){
        return getEnumPro(enumClass, ENUM_VALUE_PRO_NAME, value, pro);
    }

    /**
     * 功能描述 通过枚举值和枚举的get方法获取枚举的属性，
     * @author SHIKAI
     * @date 2019/5/10
     * @param enumValueProName 枚举的值属性名
     * @param value 枚举的值
     * @param pro 枚举的其他属性get方法（getdesc 或者其他自定义属性）
     * @return
     */
    public static <T> T getEnumPro(Class<?> enumClass, String enumValueProName, Integer value, String pro){
        try {
            Object[] enumObjs =  enumClass.getEnumConstants();
            for (Object enumObj : enumObjs) {
                Integer enumVal = ReflectUtil.invoke(enumObj, enumValueProName);
                if (enumVal.intValue() == value.intValue()) {
                    return ReflectUtil.invoke(enumObj, pro);
                }
            }
        }catch (Exception e){
            return null;
        }
        return null;
    }

    /**
     * 功能描述 获取枚举的JSONArray
     * @author SHIKAI
     * @date 2019/5/10
     * @param
     * @return
     */
    public static List<EnumProDto> toProList(Class<?> enumClass){
        List<EnumProDto> enumProList = new ArrayList<>();
        try {
            Object[] enumObjs = enumClass.getEnumConstants();
            for (Object enumObj : enumObjs) {
                enumProList.add(EnumProDto.builder()
                .value(ReflectUtil.invoke(enumObj, "getValue"))
                .desc(ReflectUtil.invoke(enumObj, "getDesc"))
                .build());
            }
        } catch (Exception e) {
            return enumProList;
        }
        return enumProList;
    }

}
